梦入琼楼寒有月,行过石树冻无烟

Laravel 控制器

控制器的存在主要用于替代路由文件中以闭包形式所有的请求处理逻辑,可以使用控制器来组织这些行为,在MVC框架之中,分为业务模型(M)、用户视图(V)、控制器(C),使用MVC的目的是将M和V的实现代码分离,控制器用于确保业务模型以及用户视图的同步,一旦业务模型进行更改,那么用户视图也会随着更改。

控制器主要存放在app/Http/Controllers/目录下,默认情况下并不会生成,需要使用命令php artisan make:controller TestController进行创建,在此会有一个命名潜规则是“作用+Controller”,如本次的控制器作用是测试则命名方式可为“TestController”即可,之后会在app/Http/Controller目录内生成该类,内容如下:

数据传递


通常我们需要将参数传递到控制器中,在Laravel之中,我们可以通过控制器进行传递,本次我们将实现一个传递id的效果:

命名空间(俗称 “路由绑定”)

在定义路由时,我们通常不需要写入完整的控制器名称,这是因为ProuteServiceProvider几乎将所有的路由文件加载到了包含名称空间的路由组中。比如一个控制器类的完整空间为namespace App\Http\Controllers;,此时我们可以在路由器中写成:

Route::get(‘/id/{id}’, ‘TestController@index’);

是可以找到TestController控制器的,当然如果你有相关的项目需要或自身的习惯也可以写完整的路径,浙江取决于你。

TestController

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php

namespace App\Http\Controllers;

use App\User;
use Illuminate\Http\Request;

class TestController extends Controller
{
public function index($id) {
echo "My is be ID: ".$id;
}
}

web.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php

/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/

Route::get('/', function () {
return view('welcome');
});

// 这里我们调用的TestController控制器的@index方法
Route::get('/id/{id}', 'TestController@index');

单个行为控制器


单个行为控制器说的通俗且简单一点就是,该控制器只用于处理你这一个请求,定义的方法也与普通的控制器有所不同,最为不同的一个点是在方法前面加了两个__,即__invoke函数:

TestController

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php

namespace App\Http\Controllers;

use App\User;
use Illuminate\Http\Request;

class TestController extends Controller
{
public function __invoke($id) {
echo "My is be ID: ".$id;
}
}

web.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php

/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/

Route::get('/', function () {
return view('welcome');
});

Route::get('/id/{id}', 'TestController');

视图控制器

与路由一样,控制器也拥有一个视图控制器,而定义方法与路由所相差无几,实现如下,在Laravel项目中,只需要在控制器中添加一个返回视图的方法以及配置路由即可:

TestController

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php

namespace App\Http\Controllers;

use App\User;
use Illuminate\Http\Request;

class TestController extends Controller
{
public function index() {
return view('welcome');
}
}

web.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php

/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/

Route::get('/', function () {
return view('welcome');
});

Route::get('/test', 'TestController@index');

之后通过访问locahost:8000/test回显的视图将是在resources/下的welcome.blade.php视图文件。

资源控制器(增删改查 “CURD”)

在Laravel中,资源控制器将经典的增删改查简化成了一行行控制器代码,Laravel为我们提供了一套约定的规则,这种规则可以方便我们的代码写的更加的完美且优雅,以下我们可以通过使用Artisan来生成一个资源控制器,使用的参数为--resource

php artisan make:controller PostController –resource

这与普通的控制器一样,会在``app\Http\Controllers```下创建一个名为PostController的控制器,且自动帮我们生成了CURD方法,我们可以通过对应请求在路由中进行绑定

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class PostController extends Controller
{
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
//
}

/**
* Show the form for creating a new resource.
*
* @return \Illuminate\Http\Response
*/
public function create()
{
//
}

/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request)
{
//
}

/**
* Display the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function show($id)
{
//
}

/**
* Show the form for editing the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function edit($id)
{
//
}

/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param int $id
* @return \Illuminate\Http\Response
*/
public function update(Request $request, $id)
{
//
}

/**
* Remove the specified resource from storage.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function destroy($id)
{
//
}
}
请求方式 Route FA 路由名称
GET /post 所有数据展现 index
GET /post/create 插入数据 create
POST /post/store 存储刚刚新提交的数据 store
GET /post/{id} 显示某个数据 show
GET /post/{id}/edit 修改某个数据 edit
PUT /post/{id} 更新数据库中某个资源 update
DELETE /post/{id} 删除某个数据 destory

如果在路由中使用该资源控制器也非常的简单,可以在web.php类中来绑定资源控制器即可:

Route::resource(‘post’, ‘PostController’);

实际开发过程中的伪造方法

在实际开发的过程中,我们会遇到很多问题,前端表单支持GET/POST方法但不支持PUT/DELETE的请求方式,所以我们在前端中需要使用一个Blade指令**@method**来使用伪造HTTP动作:

1
2
3
4
<form action="/post/update" method="POST">
@method('PUT')
……
</form>

指定资源路由

指定资源路由在官方文档中被命名为“部分资源路由”,这里我们以白名单与黑名单为例子让读者更加进一步理解:

1
2
3
4
5
6
7
8
9
10
11
12
// 使用所有
Route::resource('post', 'PostController');

// 白名单 -> Only 只有……
Route::resource('post', 'PostController')->only([
'index' //…… ‘index', 'show' 'create'
]);

// 黑名单 -> except 除了……以外
Route::resource('post', 'PostController')->except([
'create', 'update' // …… 'index'
]);

白名单(only)

白名单指only,中文译名为,顾名思义指这个处理器包含什么样的行为,在Laravel之中默认行为是所有。

1
2
3
4
// 白名单 -> Only 只有……
Route::resource('post', 'PostController')->only([
'index' //…… ‘index', 'show' 'create'
]);

黑名单 (except)

Laravel之中的except可以理解为是黑名单,但原意思是“除了……之外”,所以以下例子为除了create、update方法,PostController之中的资源路由我全要。

1
2
3
4
// 黑名单 -> except 除了……以外
Route::resource('post', 'PostController')->except([
'create', 'update' // …… 'index'
]);

命名资源路由

在资源控制器名称写入路由的时候,当处理需求较小的情况下还好,但一旦数据非常的庞大,我们除了对路由进行分组,也有一个命名资源路由的方法,只需要使用names即可:

1
2
3
Route::resource('post', 'PostController')->names([
'create' => 'post.create'
]);

资源路由参数

为了让前端变得更加美妙且更好的分辨,Laravel为我们提供了一种用于命名资源路由的方法parameters

1
2
3
Route::resource('post', 'PostController')->parameters([
'post' => 'test_post'
]);

之后将会生成/post/{post_test}的url构造。

⬅️ Go back